// 加载动画
import { ElLoading } from 'element-plus';
// import { loading as CONF } from './_config.js'
import { generateGuid } from './_base.js'

let nStartTime = -1, // 记录开始时间（1970 年 1 月 1 日至今的毫秒数）
    nCloseTimer, // 避免闪屏的定时器，到时间后隐藏 loading
    aLoadingKey = [], // 储存所有key的顺序，show的时候添加，hide的时候删除对应key
    aLoadingNokey = [], // 储存没有传key的顺序，show的时候添加，hide的时候删除对应key
    oLoadingIn = {}, // 储存key和对应显示内容sIn，show的时候添加，remove时候清空
    oLoadingInstance = null; // 储存loading实例

// 显示加载动画
const showLoading = (opts) => {
    let api;
    opts = {
        //key: ,// 没有传入key，默认储存当前时间戳
        content: CONF.content, // 加载时显示的文字
        ...opts
    };
    const fInit = function() {
        let sKey = opts.key || generateGuid('wiLoading'), // 记录当前key值，没有生成唯一键
            sIn = opts.content; // 显示内容
        if (aLoadingKey.indexOf(sKey) > -1) { // key重复 忽略不处理
            return false;
        }!opts.key && aLoadingNokey.push(sKey); // 没有传key,将key值存在aLoadingNokey
        aLoadingKey.push(sKey); // key储存在aLoadingKey中 记录顺序
        oLoadingIn[sKey] = sIn; // 将内容储存在oLoadingIn
        // 若aLoadingIn只有一项，则需要更新显示内容
        if (aLoadingKey.length === 1) {
            if (nCloseTimer) { // 若aLoadingIn只有一项，且有定时器，则仅需更新显示内容
                clearTimeout(nCloseTimer); // 清除防闪屏定时器
                nCloseTimer = undefined;
            }
            else { // 若aLoadingIn只有一项，且无定时器，则为第一次showloading，显示loading动画
                nStartTime = new Date().getTime(); // 返回 1970 年 1 月 1 日至今的毫秒数。
            }
            oLoadingInstance = ElLoading.service({
                text: sIn,
                lock: true,
                background: 'rgba(0, 0, 0, 0.6)'
            });
        }
        api.key = sKey;
    };
    api = {
        //key: sKey// 在 fInit() 中赋值，未传 opts.key 时需要在组件中生成
    };
    fInit();
    return api;
};
const hideLoading = (opts) => {
    opts = {
        //key: ,// 删除对应的key 如果没有key 则删除第一个（最早显示的）未定义key的项
        ...opts
    };
    let sKey, // 要删除的key
        nKeyIdx, // sKey在aLoadingKey中的序号
        nDiff; // 当前距离最早结束时间剩余的毫秒数
    // 要删除的key判断顺序 传入的key > 未传key数组第一项
    sKey = opts.key || aLoadingNokey[0];
    nKeyIdx = aLoadingKey.indexOf(sKey);
    if (nKeyIdx === -1) { // 如果传入的key不存在 则不操作
        return false;
    }
    const fRemove = function() {
        nCloseTimer = undefined;
        nStartTime = -1; // 将开始时间归零
        oLoadingIn = {}; // 清空储存的显示内容sIn
        setTimeout(() => { // element的弹框关闭需要放在异步里
            oLoadingInstance.close();
        }, 0)
    };
    const fUpdata = function() {
        const nNoKey = aLoadingNokey.indexOf(sKey);
        // 删除对应的key
        aLoadingKey.splice(nKeyIdx, 1);

        if (nNoKey !== -1) {
            aLoadingNokey.splice(nNoKey, 1);
        }
        if (nKeyIdx === 0 && aLoadingKey[0]) { // 若删除的为当前显示项（第一项），则更新dom显示内容 如果无显示内容（最后一项被hide） 则不修改
            oLoadingInstance = ElLoading.service({
                text: oLoadingIn[aLoadingKey[0]],
                lock: true,
                background: 'rgba(0, 0, 0, 0.6)'
            });
        }
    };
    fUpdata(); // 更新数据和显示内容
    if (aLoadingKey.length === 0) { // 所有loading都已hide，则删除loading
        if (nStartTime > -1) { // 记录了开始时间
            nDiff = nStartTime + CONF.duration - new Date().getTime();
            if (nDiff <= 0) { // 已经超过最早结束时间
                fRemove();
            }
            else {
                nCloseTimer = setTimeout(fRemove, nDiff);
            }
        }
        else {
            fRemove();
        }
    }
};

export { showLoading, hideLoading }